/*
===========================================================================
Copyright (C) 1999-2005 Id Software, Inc.
Copyright (C) 2006 Robert Beckebans <trebor_7@users.sourceforge.net>

This file is part of XreaL source code.

XreaL source code is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the License,
or (at your option) any later version.

XreaL source code is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with XreaL source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
===========================================================================
*/

#include "qfiles.h"


void            CM_LoadMap(const char *name, qboolean clientload, int *checksum);
void            CM_ClearMap(void);
clipHandle_t    CM_InlineModel(int index);	// 0 = world, 1 + are bmodels
clipHandle_t    CM_TempBoxModel(const vec3_t mins, const vec3_t maxs, int capsule);

void            CM_ModelBounds(clipHandle_t model, vec3_t mins, vec3_t maxs);

int             CM_NumClusters(void);
int             CM_NumInlineModels(void);
char           *CM_EntityString(void);

// returns an ORed contents mask
int             CM_PointContents(const vec3_t p, clipHandle_t model);
int             CM_TransformedPointContents(const vec3_t p, clipHandle_t model, const vec3_t origin, const vec3_t angles);

void            CM_BoxTrace(trace_t * results, const vec3_t start, const vec3_t end,
							vec3_t mins, vec3_t maxs, clipHandle_t model, int brushmask, traceType_t type);
void            CM_TransformedBoxTrace(trace_t * results, const vec3_t start, const vec3_t end,
									   vec3_t mins, vec3_t maxs,
									   clipHandle_t model, int brushmask,
									   const vec3_t origin, const vec3_t angles, traceType_t type);
void            CM_BiSphereTrace(trace_t * results, const vec3_t start,
								 const vec3_t end, float startRad, float endRad, clipHandle_t model, int mask);
void            CM_TransformedBiSphereTrace(trace_t * results, const vec3_t start,
											const vec3_t end, float startRad, float endRad,
											clipHandle_t model, int mask, const vec3_t origin);

byte           *CM_ClusterPVS(int cluster);

int             CM_PointLeafnum(const vec3_t p);

// only returns non-solid leafs
// overflow if return listsize and if *lastLeaf != list[listsize-1]
int             CM_BoxLeafnums(const vec3_t mins, const vec3_t maxs, int *list, int listsize, int *lastLeaf);

int             CM_LeafCluster(int leafnum);
int             CM_LeafArea(int leafnum);

void            CM_AdjustAreaPortalState(int area1, int area2, qboolean open);
qboolean        CM_AreasConnected(int area1, int area2);

int             CM_WriteAreaBits(byte * buffer, int area);

int             CM_LerpTag(orientation_t * tag, clipHandle_t model, int startFrame, int endFrame,
						   float frac, const char *tagName);

int             CM_MarkFragments(int numPoints, const vec3_t * points, const vec3_t projection,
								 int maxPoints, vec3_t pointBuffer, int maxFragments, markFragment_t * fragmentBuffer);

void            CM_DrawDebugSurface(void (*drawPoly) (int color, int numPoints, float *points));
